Vue.prototype.mount = function () {
  // 提供一个 render 方法: 生成 虚拟 DOM
  this.render = this.createRenderFn()
  this.mountComponent()
}
Vue.prototype.mountComponent = function () {
  let mount = () => {
    this.update(this.render())
  }
  // 这个 Watcher 就是全局的 Watcher, 在任何一个位置都可以访问他了 ( 简化的写法 )
  new Watcher( this, mount ) // 相当于这里调用了 mount
}
Vue.prototype.createRenderFn = function () {
  return function render () {
    let ast = getVNode(this._el)
    let temp = compile(ast, this._data)
    return temp
  }
}
// 将虚拟 DOM 渲染到页面中: diff 算法就在里
Vue.prototype.update = function (vnode) {
  // 获取返回真实DOM节点树
  let realDom = parseVNode(vnode)
  // 替换模板渲染到页面上
  this._parent.replaceChild(realDom, document.querySelector('#root'))
  // 这个算法是不负责任的: 
  // 每次会将页面中的 DOM 全部替换
}